/*********************************************************************************
* Copyright (c) zhujinyang.
* All rights reserved.
*
* \file
*
* Module initialization implementation
*
* 
*********************************************************************************/
#ifndef MODULE_H
#define MODULE_H



/*
********************************************************************************
* The initialization sequence value must be less than or MODULE_ORDOR_MAX
********************************************************************************
*/
#define MODULE_ORDOR_MAX     10



/*
********************************************************************************
* Define the initialization structure
********************************************************************************
*/
typedef struct {
    unsigned int ordor;
    void       (*init)(void);
} MODULE_STRUCT_T;


/** 
 * Module initialization macros 
 * @ordor: initialization order, smaller values are initialized first, this value must be less than MODULE_ORDOR_MAX
 * @init_func: module initialization function pointer
 */
#define BSP_MODULE_INIT(ordor, init_func)  \
    void dummy##init_func(void) {(void)(sizeof(char [(ordor >= MODULE_ORDOR_MAX)? -1 : 1]));} \
    __attribute__((section(".bsp_drv"), used)) static MODULE_STRUCT_T init_func##_tbl = {ordor, init_func}

#define MAL_MODULE_INIT(ordor, init_func)  \
    void dummy##init_func(void) {(void)(sizeof(char [(ordor >= MODULE_ORDOR_MAX)? -1 : 1]));} \
    __attribute__((section(".mal_drv"), used)) static MODULE_STRUCT_T init_func##_tbl = {ordor, init_func}
    
#define APP_MODULE_INIT(ordor, init_func)  \
    void dummy##init_func(void) {(void)(sizeof(char [(ordor >= MODULE_ORDOR_MAX)? -1 : 1]));} \
    __attribute__((section(".app_drv"), used)) static MODULE_STRUCT_T init_func##_tbl = {ordor, init_func}
    
#endif









